//
#ifndef UC_BRFACE_H
#define UC_BRFACE_H 1

#include "zadesk.h"
#include "zrxobject.h"
#include "zrxboiler.h"
#include "zgegbl.h"
#include "ucbrgbl.h"
#include "ucbrent.h"


// forward class declarations
class UcGeSurface;
class UcGeNurbSurface;
class UcGeExternalBoundedSurface;
class UcGeCurve3d;
class UcGePoint3d;
class UcBrShell;


class DllImpExp UcBrFace : public UcBrEntity
{
public:
    UCRX_DECLARE_MEMBERS(UcBrFace);
    UcBrFace();
    UcBrFace(const UcBrFace& src);
    ~UcBrFace();

    // Assignment operator
    UcBrFace&           operator =      (const UcBrFace& src);

    // Geometry
    UcBr::ErrorStatus   getSurfaceType  (UcGe::EntityId& type) const;
    UcBr::ErrorStatus   getSurface      (UcGeSurface*& surface) const;
    UcBr::ErrorStatus   getOrientToSurface(ZSoft::Boolean& bOrientToSurface) const;
	UcBr::ErrorStatus	getArea			(double&		area, 
										 const double&	tolRequired = *(double*)NULL,										
										 double&		tolAchieved = *(double*)NULL) const;

	// Set-Membership Classification Note: deprecated functions)
    UcBr::ErrorStatus   getPointRelationToFace(const UcGePoint3d& point, UcBr::Relation& relation) const;
    UcBr::ErrorStatus   getCurveRelationToFace(const UcGeCurve3d& curve, UcBr::Relation& relation) const;

    // Geometry
    UcBr::ErrorStatus   getSurfaceAsNurb(UcGeNurbSurface& nurb,
		                                 const double&    fitTolRequired = *(double*)NULL,
										 double&          fitTolAchieved = *(double*)NULL) const;
    UcBr::ErrorStatus   getSurfaceAsTrimmedNurbs(ZSoft::UInt32&                numNurbs,
		                                         UcGeExternalBoundedSurface**& ppNurbs) const;

    // Upward links
    // Shell usage of face (1::1)
    UcBr::ErrorStatus   getShell        (UcBrShell& shell) const;
};


#endif

